package com.imooc.pay.controller;

import com.imooc.pay.config.WxAccountConfig;
import com.imooc.pay.enums.PayPlatFormEnum;
import com.imooc.pay.pojo.PayInfo;
import com.imooc.pay.service.PayService;
import com.lly835.bestpay.config.WxPayConfig;
import com.lly835.bestpay.enums.BestPayTypeEnum;
import com.lly835.bestpay.model.PayResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.math.BigDecimal;

import java.util.HashMap;

@Controller
@RequestMapping("pay")
@Slf4j
public class PayController {

    @Autowired
    private PayService payService;

    @Autowired
    private WxPayConfig wxPayConfig;

    /**
     * 给别的系统，对外提供的接口，用来创建订单。
     *
     * @param orderId
     * @param amount
     * @param bestPayTypeEnum
     * @return
     */
    @GetMapping("create")
    public ModelAndView create(@RequestParam("orderId") String orderId,
                               @RequestParam("amount") BigDecimal amount,
                               @RequestParam("payType") BestPayTypeEnum bestPayTypeEnum) {

        PayResponse response = payService.create(orderId, amount, bestPayTypeEnum);

        HashMap<String, String> hashMap = new HashMap<>();
        if (bestPayTypeEnum == BestPayTypeEnum.WXPAY_NATIVE) {
            // 二维码的url
            hashMap.put("codeUrl", response.getCodeUrl());
            hashMap.put("orderId", orderId);
            // 支付成功之后返回的地址
            hashMap.put("returnUrl", wxPayConfig.getReturnUrl());
            return new ModelAndView("createForWxNative", hashMap);
        } else if (bestPayTypeEnum == BestPayTypeEnum.ALIPAY_PC) {
            hashMap.put("body", response.getBody());
            return new ModelAndView("createForAlipayPc", hashMap);
        }

        throw new RuntimeException("暂不支持的支付类型");
    }

    /**
     * 订单支付完成之后，微信发送的异步通知信息。
     * 如果不返回正确的成功接收信息发送回去，微信会一直发送异步的通知信息。
     *
     * @param notifyData
     * @return
     */
    @PostMapping("notify")
    @ResponseBody
    public String asyncNotify(@RequestBody String notifyData) {
        log.info("notifyData={}", notifyData);
        return payService.asyncNotify(notifyData);
    }

    /**
     * 通过orderId查询订单的状态。
     * 前端设置一个定时器，每隔一段时间，就查询一下订单的状态。
     * 如果订单已经支付成功，就进行页面的跳转。
     *
     * @param orderId
     * @return
     */
    @GetMapping("queryByOrderId")
    @ResponseBody
    public PayInfo queryByOrderId(@RequestParam("orderId") String orderId) {
        log.info("查询支付记录...");
        return payService.queryByOrderId(orderId);
    }


}
